<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="KqGOs" id="KqGOs"><span data-lake-id="u0f1afd7e" id="u0f1afd7e">典型回答</span></h1>
  <p data-lake-id="ub311490a" id="ub311490a"><br></p>
  <p data-lake-id="u0de58e0f" id="u0de58e0f"><br></p>
  <p data-lake-id="ue394bcb1" id="ue394bcb1"><span data-lake-id="uee2b0a98" id="uee2b0a98">在Java中，int a = 1;这条语句可以被认为是原子性操作，因为它是一个简单的赋值语句，它在一个操作中完成，不会被中断。在单线程的情况下，这条语句将会原子性地执行，即将1赋值给变量a的操作是不可分割的，不会被其它线程中断。</span></p>
  <p data-lake-id="ud0d6f351" id="ud0d6f351"><span data-lake-id="u255c16ea" id="u255c16ea">​</span><br></p>
  <p data-lake-id="u633b820c" id="u633b820c"><span data-lake-id="uf6e01c37" id="uf6e01c37">但是，在多线程的情况下，多个线程可以同时访问和修改同一个变量，这就可能导致竞态条件（race condition）的问题，即多个线程争夺同一个资源，导致结果无法预测。</span></p>
  <p data-lake-id="u7b6dc6e8" id="u7b6dc6e8"><span data-lake-id="uac09521e" id="uac09521e">​</span><br></p>
  <p data-lake-id="ud17dba9e" id="ud17dba9e"><span data-lake-id="u3b86d6fa" id="u3b86d6fa">举个例子：</span></p>
  <p data-lake-id="uca6135cf" id="uca6135cf"><span data-lake-id="u8e12a8be" id="u8e12a8be">​</span><br></p>
  <pre lang="java"><code>
int a = 0;

// 线程1
a = 1;

// 线程2
a = 2;

</code></pre>
  <p data-lake-id="u719a3200" id="u719a3200"><br></p>
  <p data-lake-id="u4c2cf659" id="u4c2cf659"><span data-lake-id="u36293184" id="u36293184">尽管每个赋值语句本身可能是原子的，但是在多线程环境中，线程1和线程2的执行顺序是不确定的。可能会出现以下情况：</span></p>
  <p data-lake-id="ucdd01918" id="ucdd01918"><span data-lake-id="u2898f7fb" id="u2898f7fb">​</span><br></p>
  <ol list="ucb7eed9d">
   <li fid="u239d0a02" data-lake-id="u58d4ca1c" id="u58d4ca1c"><span data-lake-id="ucd165983" id="ucd165983">线程1执行完毕后，线程2再执行，此时a的值为2。</span></li>
   <li fid="u239d0a02" data-lake-id="ua80fcd1c" id="ua80fcd1c"><span data-lake-id="udfb1291e" id="udfb1291e">线程2执行完毕后，线程1再执行，此时a的值为1。</span></li>
  </ol>
  <p data-lake-id="u21458cae" id="u21458cae"><br></p>
  <p data-lake-id="u766e8e4d" id="u766e8e4d"><span data-lake-id="ud7cd8594" id="ud7cd8594">这种情况被称为竞态条件（race condition）。为了避免竞态条件和确保线程安全，可以使用同步机制，例如使用 synchronized 关键字或者 java.util.concurrent 包中的原子类（如 AtomicInteger）来保护共享数据的访问。这样可以确保在同一时刻只有一个线程能够访问共享数据，从而避免竞态条件。</span></p>
 </body>
</html>